今天不討論AJAX的一些內容,主要想了解如何使用fetch()
去抓網路資料。
fetch()
是一個全域的方法,執行之後如果得到回應,會回傳一個有Response
回應物件的promise
物件。通常只有在網路錯誤的情況下時,promise
才會拒絕。fetch()
語法是fetch(resource, options)
,第一個參數要放url
,第二個則是一些可選參數,如果沒有設定,那在預設上就是GET
。
我一度以為「請求方法」是請求一筆資料,但實際上它是指示發送請求的方式,所以在fetch()
的第二個參數中可以指定的method
,這些方法通常與CRUD相對應,包含get
、post
、put
、delete
等。
首先今天使用Ajax Type Ahead with fetch() - #JavaScript30 6/30提供的資料來跑一次流程。
在使用fetch()
時,可使用promise
或async
、await
的語法,下面直接示範:
const webData = 'https://gist.githubusercontent.com/Miserlou/c5cd8364bf9b2420bb29/raw/2bf258763cdddd704f8ffd3ea9a3e81d25e2c6f6/cities.json';
fetch(webData)
//抓取response物件
.then(response=>console.log(response))
//如果沒有成功抓取,就報錯
.catch(err=>console.log(err))
Response
的屬性中,status是網頁的狀態碼,如果數字在200-299,那麽ok
就是true
。
在我們得到response
物件後,需要先透過幾個不同方法解析需要的資料:
response
解析成文字response
解析成jsonBlob
的形式回傳response用上述json的方式來解析資料:
const webData = 'https://gist.githubusercontent.com/Miserlou/c5cd8364bf9b2420bb29/raw/2bf258763cdddd704f8ffd3ea9a3e81d25e2c6f6/cities.json';
fetch(webData)
//抓取response物件
.then(response=>response.json())
.then(data=>console.log(data))//(1000)[{…}, {…}, {…}...
//如果沒有成功抓取,就報錯
.catch(err=>console.log(err))
在嘗試這次的方法時,中間出了一些問題,比方說明明網頁狀態碼是200
,卻依然回傳錯誤的問題,還有像是CORS
的部份,以及Blob
跟ArrayBuffer
、file
的關係,等以後再來研究;)
另外從明天開始到尾聲,內容會是Javascript30系列中找幾天在講像是canvas或播放器的主題,可當作了解Javascript30的教學或內容即可。(其實這篇也算,但我想把重點放在fetch
的概念)
{JSON} Placeholder:Free fake API for testing and prototyping.(只是拿出來分享)